package cn.sfrog.common.core.domain;

import cn.sfrog.common.constant.HttpStatus;
import com.alibaba.fastjson.JSONObject;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

import java.util.HashMap;
import java.util.Map;

/**
 * 操作消息提醒，api端
 */
@ApiModel(description = "通用返回VO")
public class ApiAjaxResult<T> {
    private static final long serialVersionUID = 1L;

    /**
     * 状态码
     */
    public static final String CODE_TAG = "code";

    /**
     * 状态码
     */
    public static final String STATUS_TAG = "status";

    /**
     * 成功状态码
     */
    public static final Integer STATUS_SUCCESS = 0;

    /**
     * 失败状态码
     */
    public static final Integer STATUS_ERROR = 1;

    /**
     * 返回内容
     */
    public static final String MSG_TAG = "msg";

    private long timestamp = System.currentTimeMillis();

    /**
     * 数据对象
     */
    public static final String DATA_TAG = "data";

    @ApiModelProperty("状态码")
    private Integer code;

    @ApiModelProperty("状态码")
    private Integer status;

    @ApiModelProperty("返回内容")
    private String msg;

    /**
     * 数据对象
     */
    @ApiModelProperty("数据对象")
    private T data;

    private Map<String, Object> exts;

    /**
     * 初始化一个新创建的 AjaxResult 对象，使其表示一个空消息。
     */
    public ApiAjaxResult() {
    }

    /**
     * 初始化一个新创建的 AjaxResult 对象
     *
     * @param code 状态码
     * @param msg  返回内容
     */
    public ApiAjaxResult(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    /**
     * 初始化一个新创建的 AjaxResult 对象
     *
     * @param code   状态码
     * @param status 状态码
     * @param msg    返回内容
     * @param data   数据对象
     */
    public ApiAjaxResult(int code, Integer status, String msg, T data) {
        this.code = code;
        this.status = status;
        this.msg = msg;
        this.data = data;
    }

    /**
     * 返回成功消息
     *
     * @return 成功消息
     */
    public static ApiAjaxResult success() {
        return ApiAjaxResult.success("操作成功");
    }

    /**
     * 返回成功数据
     *
     * @return 成功消息
     */
    public static <T> ApiAjaxResult<T> success(T data) {
        return ApiAjaxResult.success("操作成功", data);
    }

    public static ApiAjaxResult successList(Object data) {
        JSONObject result = new JSONObject();
        result.put("list", data);
        return ApiAjaxResult.success("操作成功", result);
    }

    /**
     * 返回成功消息
     *
     * @param msg 返回内容
     * @return 成功消息
     */
    public static ApiAjaxResult success(String msg) {
        return ApiAjaxResult.success(msg, null);
    }

    /**
     * 返回成功消息
     *
     * @param msg  返回内容
     * @param data 数据对象
     * @return 成功消息
     */
    public static <T> ApiAjaxResult<T> success(String msg, T data) {
        return new ApiAjaxResult(HttpStatus.SUCCESS, STATUS_SUCCESS, msg, data);
    }

    /**
     * 返回错误消息
     *
     * @return
     */
    public static ApiAjaxResult error() {
        return ApiAjaxResult.error("操作失败");
    }

    /**
     * 返回错误消息
     *
     * @param msg 返回内容
     * @return 警告消息
     */
    public static ApiAjaxResult error(String msg) {
        return ApiAjaxResult.error(HttpStatus.ERROR, msg);
    }

    /**
     * 返回错误消息
     *
     * @param msg  返回内容
     * @param data 数据对象
     * @return 警告消息
     */
    public static ApiAjaxResult error(String msg, Object data) {
        return new ApiAjaxResult(HttpStatus.ERROR, STATUS_ERROR, msg, data);
    }

    /**
     * 返回错误消息
     *
     * @param code 状态码
     * @param msg  返回内容
     * @return 警告消息
     */
    public static ApiAjaxResult error(int code, String msg) {
        return new ApiAjaxResult(code, STATUS_ERROR, msg, null);
    }

//    /**
//     * 方便链式调用
//     *
//     * @param key   键
//     * @param value 值
//     * @return 数据对象
//     */
//    @Override
//    public ApiAjaxResult put(String key, Object value) {
//        super.put(key, value);
//        return this;
//    }

    public long getTimestamp() {
        return this.timestamp;
    }

    public void setTimestamp(long timestamp) {
        this.timestamp = timestamp;
    }
    public Integer getCode() {
        return code;
    }

    public Integer getStatus() {
        return status;
    }

    public String getMsg() {
        return msg;
    }

    public T getData() {
        return data;
    }

    public Map<String, Object> getExts() {
        return exts;
    }

    public ApiAjaxResult<T> addExt(String key, Object value) {
        if (exts == null) {
            exts = new HashMap<>(16);
        }
        exts.put(key, value);
        return this;
    }
}
